package cn.infrabase.crypto.digest;

import cn.infrabase.core.util.CharsetUtils;

import javax.annotation.Nullable;
import java.nio.charset.Charset;

/**
 * MD5消息摘要算法。
 *
 * @author Weimin Gao
 * @since 1.0.0
 **/
 class Md5 extends Digester {

    /**
     * 构造函数。
     *
     * @param salt         盐值。
     * @param saltPosition 加盐位置，即将盐值字符串放置在数据的位置，默认0。
     * @param digestCount  摘要次数，当此值小于等于1，默认1。
     */
    public Md5(@Nullable byte[] salt, int saltPosition, int digestCount) {
        this();
        this.salt = salt;
        this.saltPosition = saltPosition;
        this.digestCount = digestCount;
    }

    /**
     * 构造。
     *
     * @param salt        盐值。
     * @param digestCount 摘要次数，当此值小于等于1，默认1。
     */
    public Md5(@Nullable byte[] salt, int digestCount) {
        this(salt, 0, digestCount);
    }

    /**
     * 构造。
     *
     * @param salt 盐值。
     */
    public Md5(@Nullable byte[] salt) {
        this(salt, 0, 1);
    }

    /**
     * 构造.
     */
    public Md5() {
        super(DigestAlgorithm.MD5);
    }

    /**
     * 创建MD5摘要算法对象。
     *
     * @return MD5摘要算法对象。
     */
    public static Md5 create() {
        return new Md5();
    }

    /**
     * 计算MD5摘要值，返回摘要结果中间第9位到第24位的值。
     *
     * @param data    被摘要数据。
     * @param charset 被摘要数据的字符集。
     * @return 摘要结果中间第9位到第24位的值。
     */
    public String digestHex16(String data, @Nullable Charset charset) {
        return DigestUtils.md5HexTo16(digestHex(data, charset));
    }

    /**
     * 计算MD5摘要值，返回摘要结果中间第9位到第24位的值。
     *
     * @param data 被摘要数据。
     * @return 摘要结果中间第9位到第24位的值。
     */
    public String digestHex16(String data) {
        return digestHex16(data, CharsetUtils.CHARSET_UTF_8);
    }

}
